昨天,我們討論了條件陳述式中最常被使用的 if-else 陳述式,而今天我們則會討論另一種條件陳述式,switch 陳述式 (Switch Statement)。
switch 陳述式的概念是透過等於比較某個指定的變數或運算式並根據該變數或運算式的值來決定要執行什麼的指令。它的做法就像是早期的網址路徑一樣,頁面會根據網址後面的部分而改變,例如 (網址)/index.html 為主頁面、(網址)/welcome.html 為歡迎頁面、(網址)/introduction.html 為介紹頁面等。由於 switch 陳述式包含了進行等於比較變數或運算式的動作,因此它跟 if-else 陳述式不同,可以使用任何資料型態的變數。可是相對的,switch 陳述式每次只能有一項用來比較的變數或運算式,而無法像 if-else 陳述式一樣同時使用多項資料為同一項的條件。
switch 陳述式的基本架構如下:
switch 變數/運算式:
case 變數/運算式回傳的值為值 A 時:
執行 指令組 (陳述式) A
break
case 變數/運算式回傳的值為值 B 時:
執行 指令組 (陳述式) B
break
case 變數/運算式回傳的值為值 C 時:
執行 指令組 (陳述式) C
break
...
default:(變數/運算式回傳的值並未被列出時)
執行 指令組 (陳述式) X
break
從它的架構來看,我們可以看到 switch 陳述式的幾個重點:
使用 switch 關鍵字來指定進行等於比較的變數或運算式
使用 case 關鍵字來列出被等於比較的變數或運算式可能的值
從這一點來看,當我們使用 case 關鍵字列出了一個該變數或運算式的可能的狀況 (下文簡稱為 case)時,就等於寫出 if (變數/運算式) == (可能的值) 的意思。
在 case 中執行的指令後會使用 break 關鍵字來進行打斷
break 關鍵字是用來告訴程式需要執行的指令組的結束,而實際上即使我們沒有使用 break 關鍵字,大多數的程式語言還是能夠不受影響繼續執行下去,可是它會從所屬的 case 開始把所有的指令組全部執行一遍。舉例來說,在上述架構的例子中,如果變數/運算式回傳的值為值 B 而我們沒有使用 break 關鍵字時,程式會自動執行從指令組 (陳述式) B 開始到指令組 (陳述式) X 的所有指令。這個特性在擁有一些需要執行相同指令的 case 時非常有用。
使用 default 關鍵字來處理變數或運算式回傳的值不屬於被列出的任何一個 case 時的狀況
從這一點來看,default 關鍵字實際上就是等同於 if-else 陳述式中的 else 的部分。
以下是一個使用 switch 來根據分數去回饋成績的例子:[Java]
import java.util.Scanner;
public class SwitchExample {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入你的分數:"); // 顯示:"請輸入你的分數:"
int score = scanner.nextInt(); // 接收使用者所輸入的分數
switch(score / 10) { // 使用 switch 陳述式並指定了 score / 10 為比較的對象,由於變數為 int,因此在 java 中小數的部分會被直接捨棄,只保留了整數的部分
case 9: // 當 score / 10 == 9 [90 - 99] 時, 由於顯示的文字跟 score / 10 == 10 時相同,因此我們故意不使用 break 關鍵字來讓程式執行 case 10 的內容
case 10: // 當 score / 10 == 10 [100] 時
System.out.println("你的成績是 A!"); // 顯示:"你的成績是 A!"
break; // 我們不希望程式執行下面的 case 的內容,因此使用 break 關鍵字進行打斷
case 8: // 當 score / 10 == 8 [80 - 89] 時
System.out.println("你的成績是 B!"); // 顯示:"你的成績是 B!"
break; // 使用 break 關鍵字進行打斷
case 7: // 當 score / 10 == 7 [70 - 79] 時
System.out.println("你的成績是 C!"); // 顯示:"你的成績是 C!"
break; // 使用 break 關鍵字進行打斷
case 6: // 當 score / 10 == 6 [60 - 69] 時
System.out.println("你的成績是 D!"); // 顯示:"你的成績是 D!"
break; // 使用 break 關鍵字進行打斷
default: // 否則:當 score 少於 60 時
System.out.println("你的成績是不及格!"); // 顯示:"你的成績是不及格!"
break; // 使用 break 關鍵字進行打斷
}
// 當 switch 陳述式中使用 break 關鍵字進行打斷程式會自動跳到這個位置
}
}
那我們什麼時候該使用 if-else 陳述式、什麼時候該使用 switch 陳述式呢?首先,就讓我們來看看它們分別的優勢吧:
if-else 陳述式
switch 陳述式
由此可見,if-else 陳述式是以較靈活的通用性為目的而設計的通用型架構,而 switch 陳述式則是以針對單項變數或運算式有多個可能的狀況時所設計的特化型架構。因此,如果我們面對單項變數或運算式有多個可能的狀況時,switch 陳述式會明顯地比 if-else 陳述式更適合被使用。但在大多數的狀況下,if-else 陳述式則會比 switch 陳述式更適合被使用。
if-else 陳述式與 switch 陳述式的比較可以說是展示了一般通用型架構跟特化型架構之間的差別,不過,是不是就代表通用型架構就會比特化型架構更好呢?這並不一定,就像是這次的例子一樣,特化型架構在它們乎合所針對的狀況下使用時往往都能比通用型架構有更好的表現與發揮。因此我們可以在考慮及評估可能會面對的狀況後再挑選使用通用型架構還是特化型架構的程式碼,這一點在我們後期開始需要自行建構及設計程式的架構時是必須要考慮的。